// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "net/cookies/cookie_store.h"

#include "base/bind.h"
#include "base/callback.h"
#include "net/cookies/cookie_options.h"

namespace net {

CookieStore::~CookieStore() { }

std::string CookieStore::BuildCookieLine(
    const std::vector<CanonicalCookie>& cookies)
{
    std::string cookie_line;
    for (const auto& cookie : cookies) {
        if (!cookie_line.empty())
            cookie_line += "; ";
        // In Mozilla, if you set a cookie like "AAA", it will have an empty token
        // and a value of "AAA". When it sends the cookie back, it will send "AAA",
        // so we need to avoid sending "=AAA" for a blank token value.
        if (!cookie.Name().empty())
            cookie_line += cookie.Name() + "=";
        cookie_line += cookie.Value();
    }
    return cookie_line;
}

std::string CookieStore::BuildCookieLine(
    const std::vector<CanonicalCookie*>& cookies)
{
    std::string cookie_line;
    for (auto* cookie : cookies) {
        if (!cookie_line.empty())
            cookie_line += "; ";
        // In Mozilla, if you set a cookie like "AAA", it will have an empty token
        // and a value of "AAA". When it sends the cookie back, it will send "AAA",
        // so we need to avoid sending "=AAA" for a blank token value.
        if (!cookie->Name().empty())
            cookie_line += cookie->Name() + "=";
        cookie_line += cookie->Value();
    }
    return cookie_line;
}

void CookieStore::DeleteAllAsync(const DeleteCallback& callback)
{
    DeleteAllCreatedBetweenAsync(base::Time(), base::Time::Max(), callback);
}

void CookieStore::SetForceKeepSessionState()
{
    // By default, do nothing.
}

void CookieStore::GetAllCookiesForURLAsync(
    const GURL& url,
    const GetCookieListCallback& callback)
{
    CookieOptions options;
    options.set_include_httponly();
    options.set_same_site_cookie_mode(
        CookieOptions::SameSiteCookieMode::INCLUDE_STRICT_AND_LAX);
    options.set_do_not_update_access_time();
    GetCookieListWithOptionsAsync(url, options, callback);
}

void CookieStore::SetChannelIDServiceID(int id)
{
    DCHECK_EQ(-1, channel_id_service_id_);
    channel_id_service_id_ = id;
}

int CookieStore::GetChannelIDServiceID()
{
    return channel_id_service_id_;
}

CookieStore::CookieStore()
    : channel_id_service_id_(-1)
{
}

} // namespace net
